﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Prob_Distributions_ClassLibrary;

namespace colas
{
    class Eleccion
    {

        private List<Item_Eleccion> lstPrimeraEleccion;
        private List<Item_Eleccion> lstSegundaEleccion;
        private List<Item_Eleccion> lstTerceraEleccion;
        private List<Item_Eleccion> lstTamanio;

        public Eleccion()
        {
            lstPrimeraEleccion = new List<Item_Eleccion>();
            lstSegundaEleccion = new List<Item_Eleccion>();
            lstTerceraEleccion = new List<Item_Eleccion>();
            //inicializo la tabla de demanda            
            Item_Eleccion i1 = new Item_Eleccion((int)Utils.eleccion.COMPRA, (double)30 / 100);
            Item_Eleccion i2 = new Item_Eleccion((int)Utils.eleccion.SE_SIENTA, (double)20 / 100);
            Item_Eleccion i3 = new Item_Eleccion((int)Utils.eleccion.DE_PASO, (double)50 / 100);
            
            lstPrimeraEleccion.Add(i1);
            lstPrimeraEleccion.Add(i2);
            lstPrimeraEleccion.Add(i3);                  
            //Ordeno la lista
            
            Item_Eleccion i4 = new Item_Eleccion((int)Utils.eleccion_consumir.SI, (double)50 / 100);
            Item_Eleccion i5 = new Item_Eleccion((int) Utils.eleccion_consumir.NO, (double)50 / 100);
            lstSegundaEleccion.Add(i4);
            lstSegundaEleccion.Add(i5);

            Item_Eleccion i6 = new Item_Eleccion((int)Utils.eleccion_tamanio.CHICO, (double)50 / 100);
            Item_Eleccion i7 = new Item_Eleccion((int)Utils.eleccion_tamanio.GRANDE, (double)50 / 100);
            lstTerceraEleccion.Add(i6);
            lstTerceraEleccion.Add(i7);

            calcularIntervalos();
        }

        private void calcularIntervalos()
        {
            double minimo = 0;
            foreach (Item_Eleccion item in lstPrimeraEleccion)
            {
                item.Min_interval = minimo;
                item.Max_interval = minimo + item.Probabilidad * 100-1;
                minimo = item.Max_interval+1;                
            }
            minimo = 0;
            foreach (Item_Eleccion item in lstSegundaEleccion)
            {
                item.Min_interval = minimo;
                item.Max_interval = minimo + item.Probabilidad * 100 - 1;
                minimo = item.Max_interval + 1;
            }
            minimo = 0;
            foreach (Item_Eleccion item in lstTerceraEleccion)
            {
                item.Min_interval = minimo;
                item.Max_interval = minimo + item.Probabilidad * 100 - 1;
                minimo = item.Max_interval + 1;
            }
        }

        //Este método debe devolver la demanda de acuerdo al random que ingresa por parámetro
        public int getPrimeraEleccion(double random_number)
        {
            //int random = (int)(random_number * 100);
            int random = (int)random_number;

            foreach (Item_Eleccion item in lstPrimeraEleccion)
            {
                if (random >= item.Min_interval && random <= item.Max_interval)
                {
                    return item.eleccion;
                }                
            }
            return -1; 
        }
        public int getSegundaEleccion(double random_number)
        {
            //int random = (int)(random_number * 100);
            
            int random=-1;
            if (random_number >= Convert.ToDouble("0" +Prob_Distributions_ClassLibrary.Utils.coma+ "5"))
                     random =1;
            if (random_number < Convert.ToDouble("0" + Prob_Distributions_ClassLibrary.Utils.coma + "5"))
                random = 0;
            
            //int random = (int)random_number;
            /*
            foreach (Item_Eleccion item in lstSegundaEleccion)
            {
                if (random >= item.Min_interval && random <= item.Max_interval)
                {
                    return item.eleccion;
                }
            }
             */
            //return -1;
            return random;
        }
        public int getTerceraEleccion(double random_number)
        {
            //int random = (int)(random_number * 100);

            int random = -1;
            if (random_number >= Convert.ToDouble("0" + Prob_Distributions_ClassLibrary.Utils.coma + "5"))
                random = 1;
            if (random_number < Convert.ToDouble("0" + Prob_Distributions_ClassLibrary.Utils.coma + "5"))
                random = 0;

            //int random = (int)random_number;
            /*
            foreach (Item_Eleccion item in lstSegundaEleccion)
            {
                if (random >= item.Min_interval && random <= item.Max_interval)
                {
                    return item.eleccion;
                }
            }
             */
            //return -1;
            return random;
        }
    }
}
